/**
 * @file CompactProtocol.h
 * @brief 紧凑型二进制协议实现
 * @author Your Name
 * @date 2025-03-30
 */

#ifndef COMPACTPROTOCOL_H
#define COMPACTPROTOCOL_H

#include "iprotocol.h"
#include "ProtocolDef.h"
#include <QMutex>

/**
 * @brief 紧凑型二进制协议实现类
 * @details 实现帧格式: [帧头(2B)][命令码(1B)][数据长度(1B)][数据体(NB)][校验位(1B)]
 */
class CompactProtocol : public IProtocol {
    Q_OBJECT
public:
    explicit CompactProtocol(QObject *parent = nullptr);
    ~CompactProtocol() override = default;

    /**
     * @brief 将命令封装为协议数据包
     * @param cmdType 命令类型
     * @param data 命令数据
     * @return 封装好的数据包
     */
    QByteArray encodePacket(uint8_t cmdType, const QByteArray& data) override;

    /**
     * @brief 解析收到的数据
     * @param recvData 接收到的原始数据
     */
    void parseReceivedData(const QByteArray& recvData) override;

private:
    /**
     * @brief 计算校验和
     * @param data 要计算校验和的数据
     * @return 校验和结果
     */
    uint8_t calculateChecksum(const QByteArray& data) const;

    /**
     * @brief 解析单个数据包
     * @param packet 完整的数据包
     */
    void parsePacket(const QByteArray& packet);

    /**
     * @brief 查找帧头
     * @param data 要搜索的数据
     * @param startPos 开始位置
     * @return 帧头位置，若未找到返回-1
     */
    int findFrameHeader(const QByteArray& data, int startPos) const;

    QByteArray m_buffer;  ///< 接收缓冲区
    QMutex m_mutex;       ///< 互斥锁保护缓冲区
};

#endif // COMPACTPROTOCOL_H
